﻿namespace Examples
{
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using CPL;

    internal class Program
    {
        private static void Main(string[] args)
        {
            var list = new List<int> { 5, 3, 4, 5, 52, 523, 2, 23, 23, 23, 55, 5546 };

            for (var parLevel = 1; parLevel <= ParallelSettings.MaxParallelismLevel; parLevel++)
            {
                Console.WriteLine(parLevel);
                var sw = new Stopwatch();
                sw.Start();
                Parallel.ForEach(list, parLevel,
                    a =>
                    {
                        for (var i = 0; i < 1000000000; i++)
                        {
                            var d = a * a / a + a;
                        }
                    });
                sw.Stop();

                Console.WriteLine(sw.Elapsed.TotalMilliseconds);

                var action = new Action<int>(a =>
                {
                    for (int i = 0; i < 10; i++)
                    {
                        var t = IsPrimeSlow(a);
                    }
                });

                int c = 10;
                int ms = 8000 * c;

                //sw.Reset();
                //sw.Start();

                //Parallel.Invoke(
                //    _ =>
                //    {
                //        for (int i = 1 * c; i < 1000 * c; i++)
                //        {
                //            action.Invoke(i);
                //        }
                //    },
                //    _ =>
                //    {
                //        for (int i = 1000 * c; i < 2000 * c; i++)
                //        {
                //            action.Invoke(i);
                //        }
                //    },
                //    _ =>
                //    {
                //        for (int i = 2000 * c; i < 3000 * c; i++)
                //        {
                //            action.Invoke(i);
                //        }
                //    },
                //    _ =>
                //    {
                //        for (int i = 3000 * c; i < 4000 * c; i++)
                //        {
                //            action.Invoke(i);
                //        }
                //    });
                //sw.Stop();
            }
        }

        public static bool IsPrimeSlow(long n)
        {
            if (n < 2)
            {
                return false;
            }

            for (long i = 2; i < n; ++i)
            {
                if ((n % i) == 0)
                {
                    return false;
                }
            }
            return true;
        }
    }
}